package com.wanxi.util;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.exceptions.JedisException;

import java.util.List;

/**
 * 使用该类前注意修改部分参数
 */
public class RedisTool {
    /**
     * HOST：redis的IP地址，
     * PART：redis的端口，
     * MAXTOTAL：redis最大连接数，
     * MAXIDLE：连接池最大空闲数，
     * MINIDLE：连接池最小空闲数
     */

    final static String HOST = "localhost";
    final static Integer PART = 6379;
    final static Integer MAXTOTAL=30;
    final static Integer MAXIDLE=8;
    final static Integer MINIDLE=4;


    /**
     * 通过jedis连接池配置文件去创建redis连接
     * @return 一个Jedis对象
     */
    private static Jedis getJedis(){
        JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(MAXTOTAL);
        jedisPoolConfig.setMinIdle(MINIDLE);
        jedisPoolConfig.setMaxIdle(MAXIDLE);
        try{
            JedisPool jedisPool=new JedisPool(jedisPoolConfig,HOST,PART);
            return jedisPool.getResource();
        }catch (JedisException exception){;
            return null;
        }
    }

    /**
     * 去redis里找值，
     * 其中 len 是这个键在redis中值的数量
     * @param key :寻找时所需要的键
     * @return
     *      （1） null:没找到，或者是redis连接失败
     *      （2） List：redis里面有并返回
     */
    public static List<String> findToRedis(String key){
        Jedis jedis=getJedis();
        if(jedis!=null){
            if(jedis.exists(key)){
                Long len =jedis.llen(key);
                return jedis.lrange(key,0,len);
            }
            jedis.close();
        }
        return null;
    }

    /**
     * 将值存放到redis，设置键的有效时间为10分钟，10分钟后失效，为了保证数据的取出能正常使用，请将list中的数据分割存储，
     * 其中 count 是存放成功的条数
     * @param key 存放时所需要的键
     * @param value 存放时所需要的值
     * @return （1）null：redis连接失败（2）Long：成功存放的条数
     */
    public static Long putListToRedis(String key,String ... value){
        Jedis jedis=getJedis();
        if(jedis!=null){
            Long count= jedis.rpush(key, value);
            jedis.expire(key,600);
            jedis.close();
            return count;
        }
        return null;
    }

    /**
     * 将值存放到redis，为了保证数据的取出能正常使用，请将list中的数据分割存储，
     * 其中 count 是存放成功的条数
     * @param key 存放时所需要的键
     * @param value 存放时所需要的值
     * @param seconds 存放的值有效时间，单位为秒
     * @return （1）null：redis连接失败（2）Long：成功存放的条数
     */
    public static Long putListToRedis(String key,Integer seconds,String ... value){
        Jedis jedis=getJedis();
        if(jedis!=null){
            Long count= jedis.rpush(key, value);
            jedis.expire(key,seconds);
            jedis.close();
            return count;
        }
        return null;
    }

    /**
     * 后端更新、修改、删除数据的时候需要清空该数据在redis中的值
     * @param key 进行清空时所需要的键
     * @return （1）null：redis连接失败或者删除失败 （2）Long：成功删除的条数
     */
    public static Long deleteToRedis(String key){
        Jedis jedis=getJedis();
        if(jedis!=null){
            Long del = jedis.del(key);
            jedis.close();
            return del;
        }
        return null;
    }

    /**
     *
     * @param key
     * @return
     */
    public static String getToRedis(String key){
        Jedis jedis=getJedis();
        if(jedis!=null){
            String value = jedis.get(key);
            return value;
        }
        return null;
    }

    /**
     *
     * @param key
     * @param value
     * @return
     */
    public static String setToRedis(String key,Integer seconds,String value){
        Jedis jedis = getJedis();
        if(key!=null && value!=null){
            String set = jedis.set(key, value);
            jedis.expire(key,seconds);
            return set;
        }
        return null;
    }

    public static void popToRedis(String key){
        Jedis jedis=getJedis();
        if(key!=null){
            jedis.lpop(key);
        }
    }
}
